﻿/**
* Класс управляет "единицой" ленты (Tape)
* @author Firsoff Maxim, ICQ:235859730, email: firsoff_maxim@mail.ru
* @version 0.1/16.02.2008 13:58
*/

package ru.vega_int.firsoff.as3.tape 
{

	//	IMPORT
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.errors.IllegalOperationError;
	import flash.events.*;
	import ru.vega_int.firsoff.as3.ImageViewer;
	import ru.vega_int.firsoff.as3.events.ImageViewerEvent;
	
	public dynamic class TapeContainer extends Sprite
	{
		
		//	PROPERTIES
		private var _url:String;				//	урл
		private var _id:Number;					//	идентификатор числовой
		private var _container:Sprite;			
		private var imageViewer:ImageViewer;	//	просмотрщик
		private var ivInitObject:Object;		//	объект настройки просмотрщика
		private var _width:Number;				//	ширина
		private var _height:Number;				//	высота
		
		private var _initWidth:Number;			//	ширина и высота заданная в начале
		private var _initHeight:Number;
		
		private var align:String;				//	выравнивание
		private var fadeEnable:Boolean;			//	всплытие
		private var borderEnable:Boolean;		//	обводка
		private var borderStyle:Object;			//	стиль обводки
		private var fadeTime:Number;			//	время всплытия в секундах
		private var smooth:Boolean;				//	сглаживание
		private var resize:Boolean;				//	нужен ресайз?
		
		public static var LOAD:String = 'load';
		//-----------------------------------------------------------------------------
		
		//// CONSTRUCTOR
		/**
		 * Конструктор
		 * @param	width		//	ширина
		 * @param	height		//	высота
		 * @param	initObj		//	объект настройки ImageViewer
		 */
		public function TapeContainer(_width:Number, _height:Number, initObj:Object) 
		{
			this._width = _initWidth = _width;
			this._height = _initHeight = _height;
			if(initObj)
			{
				if(initObj.align){this.align = String(initObj.align);}
				else{this.align = 'TL';};
				
				this.fadeEnable = Boolean(initObj.fadeEnable);
				this.borderEnable = Boolean(initObj.borderEnable);
				this.fadeEnable = Boolean(initObj.fadeEnable);
				this.smooth = Boolean(initObj.smooth);
				this.resize = Boolean(initObj.resize);
				
				this.borderStyle = initObj.borderStyle;
				
				if(initObj.fadeTime){this.fadeTime = Math.abs(Number(initObj.fadeTime));}
				else{this.fadeTime = 0.5;};
			}
			else{throw new IllegalOperationError('plaese set param [initObj:Object]');};
			init();
		};
		//-----------------------------------------------------------------------------
		// 	METHODS
		//	private
		
		/**
		 * Настройка
		 */
		private function init() :void
		{
			_container = new Sprite();
			addChild(_container);
		};
		
		/**
		 * Отрисовка фона, необходимо для корректной работы ImageViewer(кстати это косяк и надо бы его переделать)
		 */
		private function drawArea(color:uint, alpha:Number, w:Number, h:Number):void
		{
			this.graphics.clear();
			this.graphics.beginFill(color, alpha);
			this.graphics.drawRect(0,0,w,h);
			_initWidth = w;
			_initHeight = h;
		};
		
		/**
		 * Установка слушателей
		 */
		private function setHandlers():void
		{
			if(imageViewer)
			{
				//trace('setHandlers')
				imageViewer.addEventListener(ImageViewerEvent.ON_ERROR, handlerError);
				imageViewer.addEventListener(ProgressEvent.PROGRESS, handlerProgress);
				imageViewer.addEventListener(ImageViewerEvent.ON_INIT, handlerComplete);
			};
		};
		
		/**
		 * Удаление обработчиков событий
		 */
		private function removeHandlers():void
		{
			if(imageViewer)
			{
				imageViewer.removeEventListener(ImageViewerEvent.ON_ERROR, handlerError);
				imageViewer.removeEventListener(ProgressEvent.PROGRESS, handlerProgress);
				imageViewer.removeEventListener(ImageViewerEvent.ON_INIT, handlerComplete);
			};
		};
		//	public
		
		/**
		 * Загрузка в контейнер файла
		 * @param	url	Ссылка на файл
		 * @param	id	Идентификатор контейнера
		 */
		public function load(url:String, id:Number):void
		{
			this._url = url;
			this._id = id;
			//	блок исключений, если imageViewer не определен
			try {imageViewer.destroy();}
			catch (e:Error){};
			//trace(this.width);
			//trace(_height);
			imageViewer = new ImageViewer(_container, url, _width, _height, align, borderEnable, borderStyle, fadeEnable, fadeTime, smooth, resize);
			imageViewer.load();
			setHandlers();
		};
		
		/**
		 * Отрисовка фона
		 * @param	color	Цвет
		 * @param	alpha	Прозрачность
		 */
		public function  setBackground(color:uint, alpha:Number, w:Number, h:Number):void
		{
			drawArea(color, alpha, w, h);
		};
		
		public function destroy():void
		{
			this.graphics.clear();
			removeHandlers();
			try {imageViewer.destroy();}
			catch (e:Error){};
			imageViewer = null;
		};
		//-----------------------------------------------------------------------------
		
		//	GETTERS/SETTERS
		public function get id():Number {return _id;};
		public function get url():String {return _url;};
		
		public function get image():Sprite
		{
			//trace('imageViewer.content = '+imageViewer.content)
			return _container;
			
		};
		
		public function get containerWidth():Number
		{
			return _initWidth;
		};
		
		public function get containerHeight():Number
		{
			return _initHeight;
		};
		//-----------------------------------------------------------------------------
		
		//	HANDLERS
		private function  handlerError(e:Event):void 
		{
			this.dispatchEvent(e);
		};
		
		private function  handlerProgress(e:Event):void 
		{
			this.dispatchEvent(e);
		};
		
		private function  handlerComplete(e:Event):void 
		{
			this.graphics.clear();	//	удаляем фон, он может не совпадать фактически с изображением
			_initWidth = this.width;
			_initHeight = this.height;
			this.dispatchEvent(e);
		};
		//-----------------------------------------------------------------------------
		
	};
	
};
